package br.unp.tasi.loja.controladores.admin;

import br.unp.tasi.loja.entidades.Categoria;
import br.unp.tasi.loja.repositorios.RepositorioCategoria;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Controlador de Categorias
 * @author jfrank
 */
@Controller
@RequestMapping("/admin/categorias")
public class ControladorAdminCategoria extends ControladorAdminBasico {

  private transient final Log log = LogFactory.getLog(ControladorAdminCategoria.class);
  @Inject
  RepositorioCategoria repositorioCategoria;

  /**
   * Listar as categorias
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/listar", method = RequestMethod.GET)
  public String listar(Model modelo, HttpSession sessao) {
    if (!isAdministrador(sessao)) {
      return "redirect:/usuario/loginform.do";
    }

    List<Categoria> categorias = repositorioCategoria.localizarTodos();
    modelo.addAttribute("categorias", categorias);
    return "categoria/listar";
  }

  /**
   * Editar uma categoria existente pelo id
   * @param modelo
   * @param id
   * @return
   */
  @RequestMapping(value = "/editar", method = RequestMethod.GET)
  public String editar(Model modelo, @RequestParam("id") Long id) {
    Categoria categoria = repositorioCategoria.localizarPeloID(id);
    modelo.addAttribute("categoria", categoria);
    return "categoria/editar";
  }

  /**
   * Exibir formulario para uma nova categoria
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/novo", method = RequestMethod.GET)
  public String novo(Model modelo) {
    Categoria categoria = new Categoria();
    modelo.addAttribute("categoria", categoria);
    return "categoria/novo";
  }

  /**
   * Persistir uma categoria
   * @param categoria
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/atualizar", method = RequestMethod.POST)
  public String atualizar(FormCategoria formCategoria, Model modelo) {

    Categoria categoria = new Categoria();
    categoria.setId(formCategoria.getId());
    categoria.setNome(formCategoria.getNome());
    categoria.setDescricao(formCategoria.getDescricao());

    repositorioCategoria.atualizar(categoria);
    return "redirect:/admin/categorias/listar.do";
  }

  /**
   * Persistir uma categoria
   * @param categoria
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/gravar", method = RequestMethod.POST)
  public String gravar(FormCategoria formCategoria, Model modelo) {

    Categoria categoria = new Categoria();
    categoria.setNome(formCategoria.getNome());
    categoria.setDescricao(formCategoria.getDescricao());

    repositorioCategoria.gravar(categoria);
    return "redirect:/admin/categorias/listar.do";
  }

  /**
   * Apagar uma categoria existente pelo id
   * @param modelo
   * @param id
   * @return
   */
  @RequestMapping(value = "/apagar", method = RequestMethod.GET)
  public String apagar(Model modelo, @RequestParam("id") Long id) {
    repositorioCategoria.apagarPeloID(id);
    return "redirect:/admin/categorias/listar.do";
  }
}
